﻿#ifndef _LAULL_FLTK_TOOL_
#define _LAULL_FLTK_TOOL_

#pragma execution_character_set("utf-8")
// !_CHINESE_  中文支持 使用unicode utf-8带签名

#include <FL/Fl.H>
#include <FL/Fl_Widget.H>
#include <FL/Fl_Double_Window.H>
#include <functional>
#include <map>
#ifdef WIN32
#define WIN32_LEAN_AND_MEAN             // 从 Windows 头文件中排除极少使用的内容
#include <Windows.h>

// 判断按键是否按下(输入键值)
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

#endif

#ifdef linux
#endif

#ifdef FAST_FLTK_INLCUDE
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Input.H>
#endif // FAST_FLTK_INLCUDE

#ifdef FLTK_USE_PNG
#include <FL/Fl_PNG_Image.H>
#pragma comment(lib, "fltk_png.lib")
#endif

#ifdef FLTK_USE_JPG
#include <FL/Fl_JPEG_Image.H>
#pragma comment(lib, "fltk_jpeg.lib")
#endif


#ifdef HIDE_CMD
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#endif // HIDE_CMD

void static fast_set_theme() {
	Fl::scheme("plastic");
	Fl::background(170, 215, 255);
}

#define MB(title, text, pattern) (MessageBox(0, TEXT(text), TEXT(title), pattern))

#ifdef Win32
// 快速MessageBox
static int FMB_utf8(const char* Strtitle, const char* Strvalue, UINT pattern) {
	// 将UTF-8编码的字符串转换为Unicode字符串
	int utf8Length = MultiByteToWideChar(CP_UTF8, 0, Strvalue, -1, NULL, 0);
	wchar_t* unicodeStr = new wchar_t[utf8Length];
	MultiByteToWideChar(CP_UTF8, 0, Strvalue, -1, unicodeStr, utf8Length);

	int utf8Length2 = MultiByteToWideChar(CP_UTF8, 0, Strtitle, -1, NULL, 0);
	wchar_t* unicodeStr2 = new wchar_t[utf8Length2];
	MultiByteToWideChar(CP_UTF8, 0, Strtitle, -1, unicodeStr2, utf8Length2);

	return MessageBoxW(NULL, unicodeStr, unicodeStr2, pattern);
}
#endif
// 消除所有传入的按钮指针的焦点显示
template<typename T, typename... Args>
void clear_buttons_focus(T* first, Args... args) {
    first->clear_visible_focus();
    clear_buttons_focus(args...);
}
template<typename T>
void clear_buttons_focus(T* last) {
    last->clear_visible_focus();
}



// 模板函数，用于设置回调函数
template <typename T, typename Func>
void fcallback(T item, Func func) {
	item->callback((Fl_Callback*)func);
}
// 用于存储回调函数的容器
static std::map<Fl_Widget*, std::function<void()>> callbacks;
// 新的回调函数，该函数接受Fl_Widget*和void*两个参数
void static new_callback(Fl_Widget* widget, void*) {
	callbacks[widget]();
}
// 模板函数，用于设置回调函数(带参数，第一个为FLTK组件，第二个为回调函数，后为回调函数传参)
template <typename T, typename Func, typename... Args>
void fcallback(T* item, Func&& func, Args&&... args) {
	// 使用std::bind绑定函数和参数
	auto bound_func = std::bind(std::forward<Func>(func), std::forward<Args>(args)...);
	// 将绑定的函数存储在std::function中
	callbacks[item] = bound_func;
	// 设置新的回调函数
	item->callback(new_callback);
}


#endif //!_LAULL_FLTK_TOOL_